# This file is executed on every boot (including wake-boot from deepsleep)
#import esp
#esp.osdebug(None)
#import webrepl
#webrepl.start()
from machine import Pin, I2C, Timer, reset
import array
import time
try:
  import usocket as socket
except:
  import socket

import network
import io
import esp
esp.osdebug(None)

import gc
gc.collect()

#ssid = 'MicroPython-AP'
#password = 'eeworldonline'

#time.sleep_ms(2000)
#Настройка точки доступа
ap_if = network.WLAN(network.AP_IF)
ap_if.active(True)
ap_if.config(essid="MyPoint", password="12345678")
#Настройка проверки пароля точки доступа
#ap_if.config(authmode=network.AUTH_WPA_WPA2_PSK)

# Настройка I2C
i2c = I2C(0, scl=Pin(18), sda=Pin(19), freq=100000)
# сканирование адресов
#lst=i2c.scan()
#for i in lst:
#    print(f"adress {i:#04x}")
#adr=i2c.readfrom_mem(104,0,17)
#print(f"Время {adr[2]:02x}:{adr[1]:02x}:{adr[0]:02x}")
#print(f"Дата  {adr[4]:02x}.{adr[5]:02x}.{adr[6]:02x}")
#print(f"Коррекция {adr[16]:#02x}")
#while True:
#    pass
# адрес часов i=104
# настройка часов
#p12=Pin(12, Pin.IN, Pin.PULL_UP) # Датчик света
#print("wait press pin12")
#while True:
#    if p12.value()==0:
#        print(f"пин12 {p12.value()}")
#       #                sec,  min, hour,dayWeek, day,  mon,year
#        data = bytearray([0x30, 0x46,0x18,0x07,   0x13, 0x04,0x24  ])
#        i2c.writeto_mem(104,0x0,data)
#        # Корретировка частоты
#        data = bytearray([0x00 ])
#        i2c.writeto_mem(104,0x10,data)
#        print("Настройка завершена")
#        break

#-----------------------



logList=[] # список файлов
i=0;       # счетчик файлов
while True:
    filename="log_"+f"{i}"+".txt"
    try:
        f=open(filename,'r')
        f.close()
        i=i+1
        logList.append(filename)
    except OSError:
        # Если нет ни одного файла для лога то создаем файл для записи
        # читаем данные часов
        if i==0:
            adr=i2c.readfrom_mem(104,0,7)
            print(f"Время {adr[2]:02x}:{adr[1]:02x}:{adr[0]:02x}")
            print(f"Дата  {adr[4]:02x}.{adr[5]:02x}.{adr[6]:02x}")
            #print(f"Коррекция {adr[16]:#02x}")
            #--запись данных в лог файл-------
            st =f"<p>{adr[4]:02x}.{adr[5]:02x}.{adr[6]:02x} {adr[2]:02x}:{adr[1]:02x}:{adr[0]:02x} Off  Button</p>\n"
            st2=f"<p>{adr[4]:02x}.{adr[5]:02x}.{adr[6]:02x} {adr[2]:02x}:{adr[1]:02x}:{adr[0]:02x}      Restart</p>\n"
            f=open(filename,"w")
            f.write(st)
            f.write(st2)
            f.close()
            logList.append(filename)
            del st
            del st2
        del filename
        break

#p16 = Pin(16, Pin.IN)  # Выключение светодиода




#--------------------------------------------
# функция сохранения лога
def saveLog(st):
    # читаем данные из последнего файла
    global  logList
    logData=[]
    with open(logList[len(logList)-1],'r') as file:
        while True:
            dt=file.readline()
            if len(dt)>0:
                logData.append(dt)
                del dt
            else:
                del dt
                break
    if (len(logData)<40):   # кол-во записей в одном файле
        with open(logList[len(logList)-1],'w') as file:
            file.write(st)
            for i in range(0,len(logData)):
                file.write(logData[i])
    else:
        filename="log_"+str(len(logList))+".txt"
        logList.append(filename)
        del filename
        with open(logList[len(logList)-1],'w') as file:
            file.write(st)
    del logData
    return
#--------------------
# инициализация пинов
p22=Pin(22, Pin.IN, Pin.PULL_UP) # Датчик света
p16 = Pin(16, Pin.IN)  # Выключение светодиода
p17 = Pin(17, Pin.IN)  # Включение автоматического режима
p4 = Pin(4, Pin.IN)    # Включение светодиода
led=Pin(2,Pin.OUT)
#led.value(0) # светодиод отключен
#---------------------------------
#--чтение данных из лог файл для восставноления состояния-------
with open(logList[len(logList)-1],'r') as file:
            st=file.readline()
#-----Восстановление режима работы
#mode_last=0 # режим работы лампы
# 0 - ручной режим led выключен
# 1 - ручной режим led включен
# 2 - авторежим  led выключен
# 3 - авторежим led включен
if st.find("Auto")>0:
    mode_last=2
    stateMode="Auto"
else:
    mode_last=0
    if st.find("Web")>0:
        stateMode="Web"
    else:
        stateMode="Button"

if st.find("On")>0:
    mode_last=mode_last+1
    led.value(1)
    stateLed="On"
else:
    led.value(0)
    stateLed="Off"
#-------- Конец поиска-------------
#--------------------------
# читаем данные часов
adr=i2c.readfrom_mem(104,0,17)
print(f"Время {adr[2]:02x}:{adr[1]:02x}:{adr[0]:02x}")
print(f"Дата  {adr[4]:02x}.{adr[5]:02x}.{adr[6]:02x}")
print(f"Коррекция {adr[16]:#02x}")
st=f"<p>{adr[4]:02x}.{adr[5]:02x}.{adr[6]:02x} {adr[2]:02x}:{adr[1]:02x}:{adr[0]:02x} {stateLed}   {stateMode}</p>\n"
st=st+f"<p>{adr[4]:02x}.{adr[5]:02x}.{adr[6]:02x} {adr[2]:02x}:{adr[1]:02x}:{adr[0]:02x}      Restart</p>\n"
saveLog(st)
del st
#print("inf loop")
#while True:
#    pass
#---------------------------
# Обработчик прерывания нажатия кнопки включения
def ledOn(pin):
    global led_last
    global mode_last
    if (mode_last==1):
        return
    else:
        
        mode_last=1
        adr=i2c.readfrom_mem(104,0,7)
        print(f"Время {adr[2]:02x}:{adr[1]:02x}:{adr[0]:02x} On   Button")
        #print(f"Дата  {adr[4]:02x}.{adr[5]:02x}.{adr[6]:02x}")
        #print(f"День недели {adr[3]}")
        st=f"<p>{adr[4]:02x}.{adr[5]:02x}.{adr[6]:02x} {adr[2]:02x}:{adr[1]:02x}:{adr[0]:02x} On   Button</p>\n"
        saveLog(st)
        print(st)
        del st
        led.value(1)
    return
#-------------------------------------------------
# обработчик кнопки выключения
def ledOff(pin):
    global led_last
    global mode_last
    if (mode_last==0):
        return
    else:
       
        mode_last=0
        adr=i2c.readfrom_mem(104,0,7)
        print(f"Время {adr[2]:02x}:{adr[1]:02x}:{adr[0]:02x} Off  Button")
        #print(f"Дата  {adr[4]:02x}.{adr[5]:02x}.{adr[6]:02x}")
        #print(f"День недели {adr[3]}")
        st=f"<p>{adr[4]:02x}.{adr[5]:02x}.{adr[6]:02x} {adr[2]:02x}:{adr[1]:02x}:{adr[0]:02x} Off  Button</p>\n"
        saveLog(st)
        print(st)
        del st
        led.value(0)
    return
#-------------------------------
# обработчик кнопки авто включения
countLed=0 # счетчик срабатывания включения
def autoMode(pin):
    global led_last
    global mode_last
    global countLed
    if (p22.value()==1):
        if (mode_last==3): # режим авто светодиод горит
            return
        else:
            countLed=3
            mode_last=3
            adr=i2c.readfrom_mem(104,0,7)
            print(f"Время {adr[2]:02x}:{adr[1]:02x}:{adr[0]:02x} On   Auto")
            #print(f"Дата  {adr[4]:02x}.{adr[5]:02x}.{adr[6]:02x}")
            #print(f"День недели {adr[3]}")
            st=f"<p>{adr[4]:02x}.{adr[5]:02x}.{adr[6]:02x} {adr[2]:02x}:{adr[1]:02x}:{adr[0]:02x} On   ButtonAuto</p>\n"
            saveLog(st)
            print(st)
            del st
            led.value(1)
           
            return
    else:
        if (mode_last==2): # режим авто светодиод негорит
            return
        else:
            countLed=0
            mode_last=2
            adr=i2c.readfrom_mem(104,0,7)
            print(f"Время {adr[2]:02x}:{adr[1]:02x}:{adr[0]:02x} Off  Auto")
            #print(f"Дата  {adr[4]:02x}.{adr[5]:02x}.{adr[6]:02x}")
            #print(f"День недели {adr[3]}")
            st=f"<p>{adr[4]:02x}.{adr[5]:02x}.{adr[6]:02x} {adr[2]:02x}:{adr[1]:02x}:{adr[0]:02x} Off  ButtonAuto</p>\n"
            saveLog(st)
            print(st)
            del st
            led.value(0)
            
            return
        
#----------------------------------
# -- регистрация прерываний по нажатию кнопки
p16.irq(handler=ledOff, trigger=Pin.IRQ_FALLING)
p17.irq(handler=autoMode, trigger=Pin.IRQ_FALLING)
p4.irq(handler=ledOn, trigger=Pin.IRQ_FALLING)

#---------------------------
#print("inf loop")
#while True:
#    pass
#------------------------

#------------------------------------------
# обработчик прерываний таймера

def autoEn(t):
    #print("timer1")
    global mode_last
    global countLed
    if mode_last==3:
        if (p22.value()==0):
            countLed=countLed-1
            if countLed==0:
                mode_last=2
                adr=i2c.readfrom_mem(104,0,7)
                print(f"Время {adr[2]:02x}:{adr[1]:02x}:{adr[0]:02x} Off  Auto")
                #print(f"Дата  {adr[4]:02x}.{adr[5]:02x}.{adr[6]:02x}")
                #print(f"День недели {adr[3]}")
                st=f"<p>{adr[4]:02x}.{adr[5]:02x}.{adr[6]:02x} {adr[2]:02x}:{adr[1]:02x}:{adr[0]:02x} Off  Auto</p>\n"
                saveLog(st)
                print(st)
                del st
                led.value(0)
        else:
            countLed=3
        return
    
    if mode_last==2:
        if (p22.value()==1):
            countLed=countLed+1
            if countLed==3:
                mode_last=3
                adr=i2c.readfrom_mem(104,0,7)
                print(f"Время {adr[2]:02x}:{adr[1]:02x}:{adr[0]:02x} On   Auto")
                #print(f"Дата  {adr[4]:02x}.{adr[5]:02x}.{adr[6]:02x}")
                #print(f"День недели {adr[3]}")
                st=f"<p>{adr[4]:02x}.{adr[5]:02x}.{adr[6]:02x} {adr[2]:02x}:{adr[1]:02x}:{adr[0]:02x} On   Auto</p>\n"
                saveLog(st)
                print(st)
                del st
                led.value(1)
        else:
            countLed=0
        return
   
    
# регистрация прерываний таймер
tim1 = Timer(1)
tim1.init(period=200, mode=Timer.PERIODIC, callback=autoEn)
#-----------------
#print("inf loop")
#while True:
#    pass

#===============================
# шаблон страницы

# Первая часть страницы
html1="""
<!DOCTYPE HTML><html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>ESP32 File Server</title>

</head>
<body>
<h1>Управление освещением</h1>

<p>"""

# Сохраняем картинки

# Последняя часть страницы
html2="""
</p>
<p>
<a href=\"?led=on\"><button>ON</button></a>  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<a href=\"?led=off\"><button>OFF</button></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<a href=\"?led=auto\"><button>AUTO</button></a>
</p>
<p></p>
<p>
<a href=\ ><button>Обновить</button></a>
</p>
<p>
"""

html3="""
</p>
<!--
<script>
setTimeout(function(){location.reload();}, 10000);
</script>
-->
</body></html>"""
# конец страницы
#=============================
# Создание сервера 

while ap_if.active() == False:
  pass

print('Connection successful')
print(ap_if.ifconfig())

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
    s.bind(('', 80))
except OSError:
    reset()
s.listen(5)

while True:
    #if gc.mem_free() < 102000:
    gc.collect()
    conn, addr = s.accept()
    print('Got a connection from %s' % str(addr))
    request = conn.recv(1024)
   # conn.settimeout(None)
    request = str(request)
    print('Content = %s' % request)
    led_on = request.find('/?led=on')
    led_off = request.find('/?led=off')
    led_auto = request.find('/?led=auto')
    if led_on == 6:
        print('LED ON')
        if (mode_last==1):
            pass
        else:
            mode_last=1
            adr=i2c.readfrom_mem(104,0,7)
            print(f"Время {adr[2]:02x}:{adr[1]:02x}:{adr[0]:02x} On   Web")
            #print(f"Дата  {adr[4]:02x}.{adr[5]:02x}.{adr[6]:02x}")
            #print(f"День недели {adr[3]}")
            st=f"<p>{adr[4]:02x}.{adr[5]:02x}.{adr[6]:02x} {adr[2]:02x}:{adr[1]:02x}:{adr[0]:02x} On   Web</p>\n"
            saveLog(st)
            print(st)
            del st
            led.value(1)
    if led_off == 6:
        print('LED OFF')
        if (mode_last==0):
            pass
        else:
            mode_last=0
            adr=i2c.readfrom_mem(104,0,7)
            print(f"Время {adr[2]:02x}:{adr[1]:02x}:{adr[0]:02x} Off  Web")
            #print(f"Дата  {adr[4]:02x}.{adr[5]:02x}.{adr[6]:02x}")
            #print(f"День недели {adr[3]}")
            st=f"<p>{adr[4]:02x}.{adr[5]:02x}.{adr[6]:02x} {adr[2]:02x}:{adr[1]:02x}:{adr[0]:02x} Off  Web</p>\n"
            saveLog(st)
            print(st)
            del st
            led.value(0)
    if led_auto == 6:
        if (p22.value()==1):
            if (mode_last==3): # режим авто светодиод горит
                pass
            else:
                countLed=3
                mode_last=3
                adr=i2c.readfrom_mem(104,0,7)
                print(f"Время {adr[2]:02x}:{adr[1]:02x}:{adr[0]:02x} On   WebAuto")
                #print(f"Дата  {adr[4]:02x}.{adr[5]:02x}.{adr[6]:02x}")
                #print(f"День недели {adr[3]}")
                st=f"<p>{adr[4]:02x}.{adr[5]:02x}.{adr[6]:02x} {adr[2]:02x}:{adr[1]:02x}:{adr[0]:02x} On   WebAuto</p>\n"
                saveLog(st)
                print(st)
                del st
                led.value(1)
        else:
            if (mode_last==2): # режим авто светодиод негорит
                pass
            else:
                countLed=0
                mode_last=2
                adr=i2c.readfrom_mem(104,0,7)
                print(f"Время {adr[2]:02x}:{adr[1]:02x}:{adr[0]:02x} Off  WebAuto")
                #print(f"Дата  {adr[4]:02x}.{adr[5]:02x}.{adr[6]:02x}")
                #print(f"День недели {adr[3]}")
                st=f"<p>{adr[4]:02x}.{adr[5]:02x}.{adr[6]:02x} {adr[2]:02x}:{adr[1]:02x}:{adr[0]:02x} Off  WebAuto</p>\n"
                saveLog(st)
                print(st)
                del st
                led.value(0)
            
    conn.send('HTTP/1.1 200 OK\n')
    conn.send('Content-Type: text/html\n')
    conn.send('Connection: close\n\n')
    #conn.sendall(response)
    #conn.send(html1)
    st=html1
    # Отправка картинки
    if mode_last==0:
        st=st+"""<img src="">"""
        #conn.send(ManOff)
        #st=st+ManOff
        #del ManOff
    if mode_last==1:
        st=st+"""<img src="">"""        
        #conn.send(ManOn)
        #st=st+ManOn
        #del ManOn
    if mode_last==2:
        st=st+"""<img src="">"""
        #conn.send(AutoOff)
        #st=st+AutoOff
        #del AutoOff
    if mode_last==3:
        st=st+"""<img src="">"""
        #conn.send(AutoOn)
        #st=st+AutoOn
        #del AutoOn
    #conn.send(html2)
    st=st+html2
    #for i in range(1,3,1):
    #    try:       
    #        with open(logList[len(logList)-i],'r') as file:
    #            st=st+file.read()
    #    except:
    #        break
    
    with open(logList[len(logList)-1],'r') as file:
                st=st+file.read()    
    if len(logList)>1:
        with open(logList[len(logList)-2],'r') as file:
            st=st+file.read()        
    #if len(logList)>2:
    #    with open(logList[len(logList)-3],'r') as file:
    #        st=st+file.read()  
    
    st=st+html3
    try:
        conn.sendall(st)
    except OSError:
        reset()
    del st
    conn.close()
    
    
   # if __name__ == "__main__":
   #     print("main txt")
